package ThreadDemo.ThreadDemo3;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User:周次煜
 * Date: 2024-07-17
 * Time：23:20
 */
public class synchronousDemo1 {


    /**
     * 解决线程问题的方案：
     *
     * 一. synchronized 锁对象修饰代码块
     *
     * 1、 synchronized  同时 -> 互斥
     * 同时给需要解决的问题进行加锁
     *  加锁时不需要引入的对象是什么
     *  只需要关注需要的线程是否一致
     *
     *
     *  对象不一致时，就会导致一边锁门
     *  一边破窗而入
     * 还是会导致线程安全的问题
     *
     */

    static int count =0;


    private static Object locker = new Object();

    public static void main(String[] args) throws InterruptedException {
        /**
         *
         *  从而在前面  {  开始对对象加锁
         *
         * 后面 } 进行解锁
         *
         */



        Thread t1 =  new Thread(()-> {
            // 给线程1 加锁
            synchronized(locker) {
                for (int i = 0; i < 100000; i++) {
                    count++;
                }
            }

        });

        Thread t2 = new Thread(()-> {
            // 给线程2 加锁

                for (int i = 0; i < 100000; i++) {
                    count++;
                }

        });



        t1.start();
        t2.start();

        t1.join();
        t2.join();


        System.out.println(count);
    }
}





/**
 *
 * synchronized 也可以用来修饰 成员方法 和 静态方法。
 *
 */


class  SynchronizedDemo {

    public static int count =0;

   static class  Counter {

      synchronized  public  void  countAdd() {
          count++;
      }

      // 上面的方法等效于 直接用this 来引用对象

       public  void  countAdd1() {

//         this 调用的对象相同
           synchronized(this) {
               count++;
           }

       }


       // 修饰静态方法
       synchronized  public static   void  countAdd3() {
           count++;
       }


       // 修饰静态方法时的等效效果
       public static   void  countAdd4() {
           synchronized (SynchronizedDemo.class) {
                 count++;
           }
       }
    }

    public static void main(String[] args) throws InterruptedException {

       Counter counter= new Counter();
        Thread t1= new Thread(()->{

            for (int i = 0; i < 50000; i++) {

                 Counter.countAdd3();

            }

        });

        Thread t2= new Thread(()->{

            for (int i = 0; i < 50000; i++) {
                Counter.countAdd3();
            }

        });


        t1.start();
        t2.start();


        t1.join();
        t2.join();

        System.out.println(count);

    }
}








